스트림의 연산
✒️ 2025-05-15 10:50 내용 수정
참고자료 : IT Blog Java 스트림 Stream (1) 총정리, TCPSchool 스트림의 중개연산, TCPSchool 스트림의 최종 연산, JEONG_AMATEUR's Java Stream Collector 반쪽짜리 스트림을 쓰던 그대에게.Advanced Stream, happydaddy's Java Collectors 알아보기
중개 연산
전체 요소 중에서 원하는 데이터만 뽑아내는 데이터 가공 단계
-
초기 스트림은 중개 연산을 통해 또 다른 스트림으로 변환한다.
-
중개 연산은 스트림을 전달 받아 스트림으로 변환하므로 연속으로 연결해서 사용할 수 있다.
-
연산은 필터-맵(filter-map) 기반의 api를 사용하여 지연(lazy) 연산을 통해 성능을 최적화한다.
-
아래는 중개 연산에 사용되는 Stream API의 메서드들을 정리하였다.
-
IntStream을 사용할 때 람다식 표현을 사용하는 경우 지역 변수의 스코프에 주의해야 한다.
IntStream.mapToObj()를 사용해서 변수들을 람다식에 쓸 수 있는 형식으로 바꿔줘야 한다.
| 분류 | 메서드 | 설명 |
|---|---|---|
| 필터 | filter() |
조건에 맞는 요소들만 남긴 스트림 반환 |
distinct() |
스트림에서 중복된 요소가 제거된 새로운 스트림을 반환 | |
| 변환 | map() |
스트림의 요소들을 주어진 함수로 변환시켜 그 반환값들로 이루어진 새로운 스트림을 반환 |
flatMap() |
각 배열의 각 요소의 반환값을 하나로 합친 새로운 스트림을 반환 | |
| 제한 | limit() |
첫 번째 요소부터 전달된 개수만큼의 요소만으로 이루어진 새로운 스트림을 반환 |
skip() |
첫 번째 요소부터 전달된 개수만큼의 요소를 제외한 나머지 요소만으로 이루어진 새로운 스트림을 반환 | |
| 정렬 | sorted() |
해당 스트림의 요소를 전달 받은 Comparator를 기준으로 정렬 |
| 확인 | peek() |
결과 스트림으로부터 요소를 소모하여 추가로 명시된 동작을 수행, 원본 스트림은 요소 소모 없음 |
최종 연산
중개 연산을 통해 변환된 스트림으로 마지막 최종 연산을 수행해 각 요소를 소모한 결과를 표시하는 단계
- 아래는 최종 연산에 사용되는 Stream API의 메서드들을 정리하였다.
| 분류 | 메서드 | 설명 |
|---|---|---|
| 출력 | forEach() |
스트림의 각 요소를 소모하여 명시된 동작을 수행 |
| 소모 | reduce() |
첫 번째와 두 번째 요소를 가지고 연산을 수행한 뒤, 그 결과 세 번째 요소를 가지고 또 다시 연산을 수행 스트림의 모든 요소에 대해 연산 수행 후 결과 반환 |
| 검색 | findFirst() |
해당 스트림에서 첫 번째 요소를 참조하는 Optional 객체를 반환 |
findAny() |
해당 스트림에서 전달 받은 요소를 참조하는 Optional 객체를 반환 | |
| 검사 | anyMatch() |
해당 스트림의 일부 요소가 특정 조건을 만족할 경우 true를 반환 |
allMatch() |
해당 스트림의 모든 요소가 특정 조건을 만족할 경우에 true를 반환 | |
nonMatch() |
해당 스트림의 모든 요소가 특정 조건을 만족하지 않을 경우에 true를 반환 | |
| 통계 | count() |
해당 스트림의 요소의 총 개수를 long 타입의 값으로 반환 |
max() |
해당 스트림의 요소 중에서 가장 큰 값을 가지는 요소를 참조하는 Optional 객체 반환 | |
min() |
해당 스트림의 요소 중에서 가장 작은 값을 가지는 요소를 참조하는 Optional 객체 반환 | |
| 연산 | sum() |
해당 스트림의 모든 요소의 총 합 반환 |
average() |
해당 스트림의 모든 요소에 대한 평균값 | |
| 수집 | collect() |
인수로 전달되는 Collectors 객체에 구현된 방법대로 스트림의 요소를 수집 |
- 병렬 스트림을 사용한다면
findAny()메서드를 사용해야 더 정확한 연산 결과를 반환한다.
Collectors 클래스의 메서드
- Collectors 클래스에는 미리 정의된 클래스 메서드들이 존재함
<R,A> R collect(Collector<? super T,A,R> collector);
| 분류 | 메서드 | 설명 |
|---|---|---|
| 스트림->배열,컬렉션 | toArray() |
스트림을 배열로 변환 |
toCollection() |
스트림을 특정 컬렉션으로 구현 | |
toList() |
스트림을 List 인스턴스로 수집 | |
toSet() |
스트림을 Set 인스턴스로 수집 | |
toMap() |
스트림을 Map 인스턴스로 수집 keyMapper와 valueMapper를 제공해야 함 |
|
| 통계, 연산 | counting() |
스트림의 모든 요소를 카운트. Stream.count()와 유사 |
maxBy() |
스트림의 가장 큰 요소를 반환 | |
minBy() |
스트림의 가장 작은 요소를 반환 | |
summingInt() |
추출된 요소의 합계를 반환 | |
averagingInt() |
추출된 요소의 평균을 반환 | |
| 소모와 같은 동작 수행 | reducing() |
첫 번째와 두 번째 요소를 가지고 연산을 수행한 뒤, 그 결과 세 번째 요소를 가지고 또 다시 연산을 수행 |
joining() |
Stream<String>의 요소를 결합 | |
| 그룹화와 분할 | groupingBy() |
일부 속성별로 객체를 그룹화하고 그 결과를 Map 인스턴스에 저장 |
partitioningBy() |
스트림 요소의 boolean 값을 key, 컬렉션을 value로 하는 Map 인스턴스로 저장 |